{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-06-09T10:44:53.505735Z",
     "start_time": "2024-06-09T10:44:53.242499Z"
    }
   },
   "source": [
    "import Config\n",
    "import joblib\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "salary_data = pd.read_csv(\"../../data/salary.csv\")\n",
    "salary_data = pd.get_dummies(salary_data, columns=['salary'], drop_first=True)\n",
    "salary_data = salary_data.replace(to_replace=\" ?\", value=np.nan)\n",
    "salary_data = salary_data.dropna()\n",
    "\n",
    "# 热编码\n",
    "salary_data = pd.get_dummies(salary_data, columns=['workclass'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['education'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['marital-status'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['occupation'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['relationship'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['race'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['sex'])\n",
    "salary_data = pd.get_dummies(salary_data, columns=['native-country'])\n",
    "\n",
    "X, y = salary_data.drop('salary_ >50K', axis=1), salary_data['salary_ >50K']\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
    "scaler = StandardScaler()\n",
    "# joblib.dump(X_train.columns, '../salary_models/salary_data_columns.pkl')\n",
    "pd.set_option('display.max_columns', None)\n",
    "print(X_train.columns)\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test)\n",
    "# joblib.dump(X.columns, '../salary_models/salary_data_columns.pkl')\n",
    "# salary_data"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss',\n",
      "       'hours-per-week', 'workclass_ Federal-gov', 'workclass_ Local-gov',\n",
      "       'workclass_ Private', 'workclass_ Self-emp-inc',\n",
      "       ...\n",
      "       'native-country_ Portugal', 'native-country_ Puerto-Rico',\n",
      "       'native-country_ Scotland', 'native-country_ South',\n",
      "       'native-country_ Taiwan', 'native-country_ Thailand',\n",
      "       'native-country_ Trinadad&Tobago', 'native-country_ United-States',\n",
      "       'native-country_ Vietnam', 'native-country_ Yugoslavia'],\n",
      "      dtype='object', length=104)\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-03T10:37:04.677800Z",
     "start_time": "2024-06-03T10:37:04.667225Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(scaler, '../salary_models/salary_scaler_model.pkl')"
   ],
   "id": "b44e3c50d731d469",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['../salary_models/salary_scaler_model.pkl']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 逻辑回归模型",
   "id": "a20d591e49ce54f2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:04:09.535619Z",
     "start_time": "2024-05-31T01:04:08.279282Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn import metrics\n",
    "\n",
    "# 逻辑回归模型\n",
    "model = LogisticRegression(solver='liblinear')\n",
    "model.fit(X_train, y_train)\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "80e07a922469ca0f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4201  330]\n",
      " [ 591  911]]\n",
      "0.8473396320238687\n",
      "0.734085414987913\n",
      "0.6065246338215713\n",
      "0.6642362376959533\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7668465146596269"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:09:21.171956Z",
     "start_time": "2024-05-31T01:09:21.165362Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/models_save/salary_LogisticRegression_model.joblib')"
   ],
   "id": "ceb9017cd3b4eed1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_LogisticRegression_model.joblib']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 决策树模型",
   "id": "ea4abf6f91923b42"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T02:20:05.265220Z",
     "start_time": "2024-05-31T02:14:30.579909Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 决策树模型\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# 设置参数网格\n",
    "param_grid = {\n",
    "    'max_depth': [i for i in range(2, 10)],\n",
    "    'min_samples_split': [i for i in range(2, 10)],\n",
    "    \"criterion\": ['gini', 'entropy'],\n",
    "    'max_leaf_nodes': [i for i in range(2, 10)],  # 最大叶子节点数\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)\n",
    "# 打印最佳参数\n",
    "# print(grid_search.best_params_)"
   ],
   "id": "3ff715c8c5ba9f8b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_depth': [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         'max_leaf_nodes': [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         'min_samples_split': [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;max_leaf_nodes&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;min_samples_split&#x27;: [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;max_leaf_nodes&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;min_samples_split&#x27;: [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=6, max_leaf_nodes=9)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=6, max_leaf_nodes=9)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T02:21:39.865425Z",
     "start_time": "2024-05-31T02:21:39.794403Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn import metrics\n",
    "from sklearn.tree import plot_tree\n",
    "\n",
    "model_tree = grid_search.best_estimator_\n",
    "y_pred = model_tree.predict(X_test)\n",
    "\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "aa64b8bb96485268",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4292  239]\n",
      " [ 703  799]]\n",
      "0.843858776727996\n",
      "0.7697495183044316\n",
      "0.5319573901464714\n",
      "0.6291338582677165\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7396048261701238"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 30
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:16:25.252225Z",
     "start_time": "2024-05-31T01:16:25.243175Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model_tree, './models/models_save/salary_DecisionTreeClassifier_model.joblib')"
   ],
   "id": "262ab9013faa5a72",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_DecisionTreeClassifier_model.joblib']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# KNN算法",
   "id": "e1dd516af301a82e"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:19:44.068200Z",
     "start_time": "2024-05-31T01:16:56.267725Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = {\n",
    "    'n_neighbors': [i for i in range(1, 11)],  # 可以尝试不同的K值\n",
    "    'weights': ['uniform', 'distance'],  # 可以尝试不同的权重策略\n",
    "    'metric': ['euclidean', 'manhattan'],  # 可以尝试不同的距离度量\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)\n",
    "# 打印最佳参数\n",
    "print(grid_search.best_params_)\n"
   ],
   "id": "43784169082d253a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'metric': 'manhattan', 'n_neighbors': 9, 'weights': 'uniform'}\n"
     ]
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "3eb9ed7c8aba5121"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:20:10.090852Z",
     "start_time": "2024-05-31T01:20:08.214733Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "ac9548c2b32b043a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4132  399]\n",
      " [ 617  885]]\n",
      "0.831592905685397\n",
      "0.6892523364485982\n",
      "0.5892143808255659\n",
      "0.6353194544149318\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7505771749636547"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T01:20:45.329469Z",
     "start_time": "2024-05-31T01:20:45.309955Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/models_save/salary_KNeighborsClassifier_model.joblib')"
   ],
   "id": "ac5e5f82f5e4f9f8",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_KNeighborsClassifier_model.joblib']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 贝叶斯算法",
   "id": "9edb6455aca02756"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T04:09:38.228659Z",
     "start_time": "2024-05-31T04:09:34.888460Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.naive_bayes import GaussianNB, MultinomialNB\n",
    "\n",
    "# 设置参数网格\n",
    "param_grid = {\n",
    "    'var_smoothing': [1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1],  # 可以尝试不同的平滑参数'\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(GaussianNB(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "6b657183d0010492",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={'var_smoothing': [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={&#x27;var_smoothing&#x27;: [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={&#x27;var_smoothing&#x27;: [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: GaussianNB</label><div class=\"sk-toggleable__content fitted\"><pre>GaussianNB(var_smoothing=0.1)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;GaussianNB<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.naive_bayes.GaussianNB.html\">?<span>Documentation for GaussianNB</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>GaussianNB(var_smoothing=0.1)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "3690879a68053ffd"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T04:10:05.336977Z",
     "start_time": "2024-05-31T04:10:05.140579Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn import metrics\n",
    "\n",
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "32621ed5cf534e0c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2488 2043]\n",
      " [ 129 1373]]\n",
      "0.6399801093983093\n",
      "0.40193208430913346\n",
      "0.9141145139813582\n",
      "0.5583570557137048\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7316103357812331"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T04:10:12.956922Z",
     "start_time": "2024-05-31T04:10:12.948056Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/models_save/salary_GaussianNB_model.joblib')"
   ],
   "id": "fcccb0ff3b89c703",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_GaussianNB_model.joblib']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 支持向量机",
   "id": "9277d1193d957c8b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T05:10:42.041828Z",
     "start_time": "2024-05-31T04:10:30.209216Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.svm import SVC\n",
    "\n",
    "# 定义参数网格\n",
    "param_grid = {\n",
    "    'C': [0.1, 1, 10],  # 可以尝试的C值\n",
    "    'gamma': ['scale', 0.01, 0.1, 1],  # 可以尝试的gamma值\n",
    "    'kernel': ['rbf']  # 这里固定为RBF核\n",
    "}\n",
    "\n",
    "# 创建网格搜索对象\n",
    "grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='f1')\n",
    "\n",
    "# 执行网格搜索\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "3b1e04b75f196fac",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={'C': [0.1, 1, 10], 'gamma': ['scale', 0.01, 0.1, 1],\n",
       "                         'kernel': ['rbf']},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={&#x27;C&#x27;: [0.1, 1, 10], &#x27;gamma&#x27;: [&#x27;scale&#x27;, 0.01, 0.1, 1],\n",
       "                         &#x27;kernel&#x27;: [&#x27;rbf&#x27;]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={&#x27;C&#x27;: [0.1, 1, 10], &#x27;gamma&#x27;: [&#x27;scale&#x27;, 0.01, 0.1, 1],\n",
       "                         &#x27;kernel&#x27;: [&#x27;rbf&#x27;]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: SVC</label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=10)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=10)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T07:05:38.259789Z",
     "start_time": "2024-05-31T07:05:31.840749Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "7b7ebe767f8cdd5c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4196  335]\n",
      " [ 610  892]]\n",
      "0.8433615116857285\n",
      "0.7269763651181744\n",
      "0.5938748335552596\n",
      "0.6537193111029681\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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a+c9HwAADC2WTzMsX75cy5Yt09y5czVv3jytXr1a7e3tuuOOOyRJt99+u0aPHq1Vq1ZJku655x5de+21+slPfqKbbrpJ69at01//+lf97Gc/s/JtAACABGF5uFmyZImampr08MMPKxgMavbs2aqurjYXDe/fv192++kJpoULF+o3v/mNHnzwQX3ve9/TlClT9Ic//EFer9eqtwAAABKI5c+5ibdYPecGAADETtI85wYAAGCwEW4AAEBKIdwAAICUQrgBAAAphXADAABSCuEGAACkFMINAABIKYQbAACQUgg3AAAgpVi+/UK89T6QORwOW1wJAADor97P7f5srDDkwk1bW5skqaSkxOJKAADAQLW1tSkvL++C5wy5vaWi0ag+/vhj5eTkyGazDeqfHQ6HVVJSogMHDrBvVQxxneOD6xwfXOf44VrHR6yus2EYamtr06hRo/psqH0uQ27mxm63a8yYMTH9Gbm5ufzDiQOuc3xwneOD6xw/XOv4iMV1/qQZm14sKAYAACmFcAMAAFIK4WYQOZ1OrVy5Uk6n0+pSUhrXOT64zvHBdY4frnV8JMJ1HnILigEAQGpj5gYAAKQUwg0AAEgphBsAAJBSCDcAACClEG4GaM2aNRo/frwyMzM1f/58vf/++xc8/3e/+52mTZumzMxMlZaWqrKyMk6VJreBXOfnnntO11xzjUaMGKERI0aorKzsE/9/wUkD/fvca926dbLZbLrllltiW2CKGOh1Pnr0qO688055PB45nU5NnTqV3x39MNDrvHr1al122WUaNmyYSkpKdO+99+rEiRNxqjY5vfnmm7r55ps1atQo2Ww2/eEPf/jE12zatElXXHGFnE6nJk+erBdeeCHmdcpAv61bt85wOBzG888/b2zbts346le/auTn5xuhUOic57/zzjtGWlqa8aMf/cjYvn278eCDDxoZGRlGbW1tnCtPLgO9zrfeequxZs0a48MPPzR27NhhfOlLXzLy8vKMgwcPxrny5DLQ69xrz549xujRo41rrrnG+Md//Mf4FJvEBnqdOzs7jblz5xoVFRXG22+/bezZs8fYtGmTsXXr1jhXnlwGep1//etfG06n0/j1r39t7Nmzx1i/fr3h8XiMe++9N86VJ5fKykrjgQceMF566SVDkvHyyy9f8Pzdu3cbWVlZxvLly43t27cbTz/9tJGWlmZU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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.759969859946908"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T07:07:56.633078Z",
     "start_time": "2024-05-31T07:07:56.620784Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/models_save/salary_svm_model.joblib')"
   ],
   "id": "c0218471128b501f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_svm_model.joblib']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 随机森林",
   "id": "ed2dc6cac5ab580c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T07:13:49.158213Z",
     "start_time": "2024-05-31T07:11:13.909705Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "rf_model = RandomForestClassifier()\n",
    "# 定义参数网格\n",
    "param_grid = {\n",
    "    'n_estimators': [1, 10, 15, 20, 30, 40, 50, 75, 100],  # 可以尝试的决策树数量\n",
    "    'max_depth': [i for i in range(2, 11)],  # 可以尝试的树的最大深度\n",
    "    'max_features': ['sqrt'],  # 可以尝试的特征选择方法\n",
    "}\n",
    "\n",
    "# 创建网格搜索对象\n",
    "grid_search = GridSearchCV(rf_model, param_grid, cv=5, scoring='f1')\n",
    "\n",
    "# 执行网格搜索\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "3d0ea217d0078ee7",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={'max_depth': [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         'max_features': ['sqrt'],\n",
       "                         'n_estimators': [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         &#x27;max_features&#x27;: [&#x27;sqrt&#x27;],\n",
       "                         &#x27;n_estimators&#x27;: [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         &#x27;max_features&#x27;: [&#x27;sqrt&#x27;],\n",
       "                         &#x27;n_estimators&#x27;: [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: RandomForestClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=10)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=10)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T07:16:13.108095Z",
     "start_time": "2024-05-31T07:16:12.922694Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "1dbfd1032f50c888",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4321  210]\n",
      " [ 687  815]]\n",
      "0.8513177523620089\n",
      "0.7951219512195122\n",
      "0.5426098535286284\n",
      "0.6450336367233874\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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p6OtGDzAym85ACC+8UkXw1pa/Xprf43KXR5tPqsYPDVvkJwOm26eYtOwNIrBAIC+g3ATYwzD0M7Pa9uLwV7VnAwtBhc77HLmUwwGAPRdhJsYcaimXmVuj8pcnReDix02OfIGUQwGAPR5hJtezO83tOb/jujFvx+R+6xi8LcmZstJMRgAgHMQbnqxNz85pvvX7pIkJSZIV186TPPybfrW5TkUgwEAOA8+IXuxA8fqJUlXjhyslbddoay0VJNHBABA78f1jF6ssva0JGnK8EEEGwAAuohw04t5axskSbZB/UweCQAAsSNs4ebll1/WlClTwvXLQZL3RNvMjS2DWRsAALqqW+HmP/7jP/Ttb39bt956q9577z1J0htvvKH8/HwtWLBAV111VUQG2VdVnmibucll5gYAgC7rcrh54okndNddd+nQoUNat26drrvuOj3++OO67bbbNH/+fH3++ed65plnIjnWPqW51a+jdYHLUszcAADQVV2+W+pPf/qTVq9erYULF+qtt97Stddeq3feeUf79+/XgAGshhtu1b4G+Q0pJSlBmQN4fAIAAF3V5Zmbw4cP67rrrpMkXXPNNUpJSdHy5csJNhFS2V4mzs3op8REVh0GAKCruhxuGhsblZracXnEYrFoyJAhERkUOsrEuZSJAQDolm4t4vfQQw+pf//+kqSmpib94he/UEZGRsg+Tz31VPhG14d5T3AbOAAAPdHlcPP1r39d+/btC34/a9YsHThwIGQfHtoYPoEF/CgTAwDQPV0ON1u2bIngMHC2wMxNbgYzNwAAdEe3Lkv5fD699957ampq0owZMzRs2LBIjavPCy7gx8wNAADd0uVw43a7ddNNN6mqqkqSlJaWphdffFFFRUURG1xf1nFZipkbAAC6o8t3S917770aNWqU3n77be3YsUPXX3+9lixZEsmx9Vmnm1r15almSVyWAgCgu7o8c7Njxw69+uqruuKKKyRJzz77rIYMGSKfz6f09PSIDbAv8rbP2gywJCk9tVtXDgEA6PO6PHNz/PhxDR8+PPj9oEGDNGDAAH3xxRcRGVhfVnnGbeDcgQYAQPd0a1pg9+7dwc6NJBmGoT179qiuri64jSeDX7zAzA0PzAQAoPu6FW6uv/56GYYRsu3mm29WQkKCDMNQQkKCWltbwzrAvih4pxSrEwMA0G1dDjcHDx6M5Dhw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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7481312344226677"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T07:16:50.727919Z",
     "start_time": "2024-05-31T07:16:50.695252Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/models_save/salary_RandomForestClassifier_model.joblib')"
   ],
   "id": "40805efa5c05211b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/salary_RandomForestClassifier_model.joblib']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
